/**
 * @file    diagnosis.h
 * @brief   诊断说明
 * @author  Liu Wei
 * @version 1.0.1
 * @date    2023-04-18
 * 
 * @copyright Copyright (c) 2023 JBD-Energy Storage Technology Co. LTD
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version   <th>Author   <th>Description
 * <tr><td>2023-04-18 <td>1.0.1     <td>Liuwei   <td>首次创建
 * </table>
 */

#ifndef __DIAGNOSIS_H_
#define __DIAGNOSIS_H_

/* File Includes -------------------------------------------------------------*/
#include <stdint.h>

/* Cplusplus -----------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif

/* Macro/Define/Typedef ------------------------------------------------------*/
enum
{ 
	CURR_DR_IDLE ,   /* 待机状态 */
	CURR_DR_CHG  ,   /* 充电状态 */
	CURR_DR_DSG  ,	 /* 放电状态 */
};
/**
 * @brief 诊断-告警ID类型 
 */
typedef enum
{
    ALM_ID_COV = 0x00,  /*!<(00)单体过压*/
    ALM_ID_CUV ,        /*!<(01)单体欠压*/
    ALM_ID_BOV ,        /*!<(02)总压过压*/
    ALM_ID_BUV ,        /*!<(03)总压欠压*/
    ALM_ID_OCC ,        /*!<(04)充电过流*/
    ALM_ID_OCD ,        /*!<(05)放电过流*/
    ALM_ID_OTC ,        /*!<(06)充电高温*/
    ALM_ID_UTC ,        /*!<(07)充电低温*/
    ALM_ID_OTD ,        /*!<(08)放电高温*/
    ALM_ID_UTD ,        /*!<(09)放电低温*/
    ALM_ID_OTM ,        /*!<(10)MOS高温*/
    ALM_ID_OTE ,        /*!<(11)环境高温*/
    ALM_ID_UTE ,        /*!<(12)环境低温*/
    ALM_ID_VDIFF ,      /*!<(13)压差过大*/
	ALM_ID_TDIFF ,      /*!<(14)温差过大*/
    ALM_ID_SOCL ,       /*!<(15)SOC过低*/
    ALM_ID_EEP ,        /*!<(16)EEP故障*/
    ALM_ID_RTC ,        /*!<(17)RTC异常*/
	ALM_ID_FCHG ,       /*!<(18)满充告警*/
}alm_id_type;

/**
 * @brief 诊断-告警ID类型 
 */
typedef enum
{
    PRP_ID_COV = 0x00,      /*!<(00)单体过压*/
    PRP_ID_CUV ,            /*!<(01)单体欠压*/
    PRP_ID_BOV ,            /*!<(02)总压过压*/
    PRP_ID_BUV ,            /*!<(03)总压欠压*/
    PRP_ID_OCC ,            /*!<(04)充电过流*/
    PRP_ID_OCC2 ,           /*!<(05)充电过流2*/
    PRP_ID_OCD ,            /*!<(06)放电过流*/
    PRP_ID_OCD2 ,           /*!<(07)放电过流2*/
    PRP_ID_OTC ,            /*!<(08)充电高温*/
    PRP_ID_UTC ,            /*!<(09)充电低温*/
    PRP_ID_OTD ,            /*!<(10)放电高温*/
    PRP_ID_UTD ,            /*!<(11)放电低温*/
    PRP_ID_OTM ,            /*!<(12)MOS高温*/
    PRP_ID_OTE ,            /*!<(13)环境高温*/
    PRP_ID_UTE ,            /*!<(14)环境低温*/
    PRP_ID_VDIFF ,          /*!<(15)压差过大*/
    PRP_ID_TDIFF ,          /*!<(16)温差过大*/
    PRP_ID_SOCL ,           /*!<(17)SOC过低*/
    PRP_ID_SC ,             /*!<(18)短路保护*/
    PRP_ID_COL ,            /*!<(19)单体掉线*/
    PRP_ID_TOL ,            /*!<(20)温度掉线*/
	PRP_ID_FT_CMOS ,        /*!<(21)充电MOS故障*/
    PRP_ID_FT_DMOS ,        /*!<(22)放电MOS故障*/
    PRP_ID_FT_LIMIT ,       /*!<(23)限流异常*/
    PRP_ID_FT_AIROSOL,      /*!<(24)气溶胶故障*/
    PRP_ID_FULL_CHG,        /*!<(25)满充保护*/
    PRP_ID_FT_AFE ,         /*!<(26)AFE通信故障*/
	PRP_ID_FT_REVERSE,      /*!<(27)反接保护 */ 
}prp_id_type;

/**
 * @brief 诊断数据类型
 */
typedef struct 
{
    uint8_t alm_state;
    uint8_t prp_state;

    uint32_t alm_time_cnt;
    uint32_t alm_recv_cnt;

    uint32_t prp_time_cnt;
    uint16_t prp_con_times; 
	uint32_t prp_recv_cnt;
}diag_data_type;

typedef struct 
{
    uint16_t lock_times;

    float alm_param;
    float alm_recv;
    uint16_t alm_dly;

    float prp_param;
    float prp_recv;
    uint16_t prp_dly;

}diag_para_type;

/**
 * @brief 诊断系统类型
 */
typedef struct 
{
    uint8_t prp_state;
    uint16_t time_cnt;
    uint16_t recv_cnt;
    uint16_t con_times;
}diag_sys_type;

/**
 * @brief 诊断告警信息
 */
typedef union 
{
    uint32_t alm_word;
    struct alm_name
    {
        uint32_t cov : 1 ;           /*!< (00)单体过高 */
        uint32_t cuv : 1 ;           /*!< (01)单体过低 */
        uint32_t bov : 1 ;           /*!< (02)总压过高 */
        uint32_t buv : 1 ;           /*!< (03)总压过低 */
        uint32_t occ : 1 ;           /*!< (04)充电过流 */
        uint32_t ocd : 1 ;           /*!< (05)放电过流 */
        uint32_t otc : 1 ;           /*!< (06)充电过温 */
        uint32_t utc : 1 ;           /*!< (07)充电欠温 */
        uint32_t otd : 1 ;           /*!< (08)放电过温 */
        uint32_t utd : 1 ;           /*!< (09)放电欠温 */
		uint32_t omtd : 1 ;          /*!< (10)MOS高温 */
        uint32_t oetd : 1 ;          /*!< (11)环境高温 */
		uint32_t uetd : 1 ;          /*!< (12)环境低温 */
        uint32_t vdiff: 1 ;          /*!< (13)压差过大 */
        uint32_t tdiff: 1 ;          /*!< (14)温差过大 */
		uint32_t socl:1;             /*!< (15)SOC过低 */
		uint32_t eep_err : 1;        /*!< (16)EEP故障 */
		uint32_t rtc_err : 1;        /*!< (17)RTC异常 */
		uint32_t full_chg : 1;       /*!< (18)电池满电 */
    }bit;
}diag_alm_type;

/**
 * @brief 诊断保护信息
 */
typedef union 
{
    uint32_t prp_word;
    struct prp_name
    {
        uint32_t cov : 1 ;           /*!< (00)单体过高 */
        uint32_t cuv : 1 ;           /*!< (01)单体过低 */
        uint32_t bov : 1 ;           /*!< (02)总压过高 */
        uint32_t buv : 1 ;           /*!< (03)总压过低 */
        uint32_t occ : 1 ;           /*!< (04)充电过流 */
		uint32_t occ2 : 1 ;          /*!< (05)充电过流 */
        uint32_t ocd : 1 ;           /*!< (06)放电过流 */
		uint32_t ocd2 : 1 ;          /*!< (07)放电过流2 */
        uint32_t otc : 1 ;           /*!< (08)充电过温 */
        uint32_t utc : 1 ;           /*!< (09)充电欠温 */
        uint32_t otd : 1 ;           /*!< (10)放电过温 */
        uint32_t utd : 1 ;           /*!< (11)放电欠温 */
		uint32_t otm : 1 ;           /*!< (12)MOS高温 */
        uint32_t ote : 1 ;           /*!< (13)环境高温 */
		uint32_t ute: 1 ;            /*!< (14)环境低温 */
		uint32_t vdiff: 1 ;          /*!< (15)压差过大 */
        uint32_t tdiff: 1 ;          /*!< (16)温差过大 */
		uint32_t socl: 1;            /*!< (17)SOC过低 */
		uint32_t sc : 1;             /*!< (18)短路保护 */
		uint32_t col : 1 ;           /*!< (19)单体掉线 */
	    uint32_t tol : 1 ;           /*!< (20)温度掉线 */
		uint32_t fcmos : 1 ;         /*!< (21)CMOS故障 */
		uint32_t fdmos : 1 ;         /*!< (22)DMOS故障 */
		uint32_t limit_err : 1;      /*!< (23)限流异常 */
		uint32_t airosol_err : 1;    /*!< (24)气溶胶故障 */
	    uint32_t full_chg :1;        /*!< (25)满充保护 */
	    uint32_t afe_err : 1;        /*!< (26)AFE通信故障*/
		uint32_t reverse : 1;        /*!< (27)反接保护 */
    }bit;
}diag_prp_type;
/* @brief */

/* Variables -----------------------------------------------------------------*/

/*******************************************************************************
* define Interface module
*
*//*! @addtogroup API LIST 
*******************************************************************************/
uint8_t diag_get_alarm(alm_id_type alm_id);
void diag_set_alarm(alm_id_type alm_id , uint8_t state);
uint32_t diag_get_all_alarm(void);

uint8_t diag_get_prp(prp_id_type prp_id);
void diag_set_prp(prp_id_type prp_id ,uint8_t state);
uint32_t diag_get_all_prp(void);
/*! @} End of Interface API List */

#ifdef __cplusplus
}
#endif

#endif  /* #ifndef __DIAGNOSIS_H_ */
/********** Copyright (c) 2023 JBD-Energy Storage Technology Co. LTD *********/
